<?php

namespace CMS\Model\Content;

use CMS\Model\File;

/** 
 * 文档模型子模型 - 下载模型
 * //TODO 依赖I $_POST等环境,需要改造
 */
class Download extends Base
{
    /* 自动验证规则 */
    protected $_validate = array(
        array(
            'content',
            'require',
            '详细内容不能为空！',
            self::MUST_VALIDATE,
            'regex',
            self::MODEL_BOTH
        ),
        array(
            'download',
            'number',
            '下载次数请输入整数！',
            self::VALUE_VALIDATE,
            'regex',
            self::MODEL_BOTH
        ),
        array(
            'file_id',
            'require',
            '请上传附件！',
            self::MUST_VALIDATE,
            'regex',
            self::MODEL_BOTH
        )
    );

    /**
     * 获取模型详细信息
     * 
     * @param integer $id
     *            文档ID
     * @return array 当前模型详细信息
     */
    public function detail($id)
    {
        $data = $this->field(true)->find($id);
        if (! $data) {
            $this->error = '获取详细信息出错！';
            return false;
        }
        $file = (new File)->field(true)->find($data['file_id']);
        return $data;
    }

    /**
     * 更新数据
     * 
     * @param intger $id 
     * @return bool         
     */
    public function update($id = 0)
    {
        /* 获取下载数据 */
        // TODO: 根据不同用户获取允许更改或添加的字段
        $data = $this->create();
        if (! $data) {
            return false;
        }
        
        $file = json_decode(think_decrypt(I('post.file_id')), true);
        if (! empty($file)) {
            $data['file_id'] = $file['id'];
            $data['size'] = $file['size'];
        } else {
            $this->error = '获取上传文件信息失败！';
            return false;
        }
        
        /* 添加或更新数据 */
        if (empty($data['id'])) { // 新增数据
            $data['id'] = $id;
            $id = $this->add($data);
            if (! $id) {
                $this->error = '新增详细内容失败！';
                return false;
            }
        } else { // 更新数据
            $status = $this->save($data);
            if (false === $status) {
                $this->error = '更新详细内容失败！';
                return false;
            }
        }
        return true;
    }

    /**
     * 下载文件
     * 
     * @param number $id 文档ID
     * @return boolean 下载失败返回false
     */
    public function download($id)
    {
        $info = $this->find($id);
        if (empty($info)) {
            $this->error = "不存在的文档ID：{$id}";
            return false;
        }
        
        $File = new File;
        $root = C('DOWNLOAD_UPLOAD.rootPath');
        $call = array(
            $this,
            'setDownload'
        );
        if (false === $File->download($root, $info['file_id'], $call, $info['id'])) {
            $this->error = $File->getError();
        }
    }

    /**
     * 新增下载次数（File模型回调方法）
     */
    public function setDownload($id)
    {
        $this->where(['id' => $id])->setInc('download');
    }

    /**
     * 保存为草稿
     * 
     * @return true 成功， false 保存出错
     */
    public function autoSave($id = 0)
    {
        $this->_validate = array();
        
        /* 获取文章数据 */
        $data = $this->create();
        if (! $data) {
            return false;
        }
        
        $file = json_decode(think_decrypt(I('post.file_id')), true);
        if (! empty($file)) {
            $data['file_id'] = $file['id'];
            $data['size'] = $file['size'];
        }
        
        /* 添加或更新数据 */
        if (empty($data['id'])) { // 新增数据
            $data['id'] = $id;
            $id = $this->add($data);
            if (! $id) {
                $this->error = '新增详细内容失败！';
                return false;
            }
        } else { // 更新数据
            $status = $this->save($data);
            if (false === $status) {
                $this->error = '更新详细内容失败！';
                return false;
            }
        }
        return true;
    }
    
}
